package org.yn.car.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.yn.base.constants.BaseConstants;
import org.yn.car.domain.CarType;
import org.yn.car.mapper.CarTypeMapper;
import org.yn.car.service.ICarTypeService;
import org.yn.base.service.impl.BaseServiceImpl;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author yn
 * @since 2023-08-18
 */
@Service
public class CarTypeServiceImpl extends BaseServiceImpl<CarType> implements ICarTypeService {
    @Autowired
    CarTypeMapper carTypeMapper;
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 循环算法
     * @param pid
     * @return
     */
    @Override
    public List<CarType> tree(Long pid) {

        // 先进来查询redis redis有就直接返回  没有再查数据库返回 并给redis值

        //查询redis
        Object obj = redisTemplate.opsForValue().get(BaseConstants.CAR_TYPE_TREE_IN_REDIS);

        if (obj!=null){//查询到有值，直接返回给前端
            System.out.println("redis中有值。。");
            return (List<CarType>) obj;
        }
        //下面就是没有找到值得逻辑

        List<CarType> result = new ArrayList<>();
        //1 查询出所有节点
        List<CarType> allCarTypes = carTypeMapper.selectAll();

        //为了方便获取父亲建立的id和类型的映射关系
        Map<Long,CarType> allCarTypesMap = new HashMap<>();
        for (CarType carType : allCarTypes) {
            allCarTypesMap.put(carType.getId(),carType);
        }
        //2 遍历所有的节点，判断是否是第一级(pid=传入pid)
        allCarTypes.forEach(carType -> {
            Long pidTmp = carType.getPid();
            if (pidTmp.longValue()==pid.longValue()){
                //2.1 如果是放入返回集合
                result.add(carType);
            }else{
                //2.2
                CarType parent = allCarTypesMap.get(pidTmp);
                //2.2.2 当做父亲儿子
                parent.getChildren().add(carType); //把自己放入父亲的集合就OK
            }
        });
            // 将查询到的数据给redis
                redisTemplate.opsForValue().set(BaseConstants.CAR_TYPE_TREE_IN_REDIS,result);
        return result;
    }

    @Override
    public void update(CarType role) {
        super.update(role);
        redisTemplate.delete(BaseConstants.CAR_TYPE_TREE_IN_REDIS);
    }

    @Override
    public void insert(CarType role) {
        super.insert(role);
        redisTemplate.delete(BaseConstants.CAR_TYPE_TREE_IN_REDIS);
    }

    @Override
    public void delete(Long id) {
        // 删除部分
//        删除一个节点 需要一起删除它的子节点  ，
//        方案1 前端处理 ，将节点的id和它的子节点发送到后端  ， 一起批量删除   ok
        super.delete(id);
        redisTemplate.delete(BaseConstants.CAR_TYPE_TREE_IN_REDIS);
    }

    @Override
    public void batchDelete(List<Long> ids) {
        super.batchDelete(ids);
        redisTemplate.delete(BaseConstants.CAR_TYPE_TREE_IN_REDIS);
    }
}
